/******************************************************************************
 *      Mestrado em Ciência da Computação - UFMS
 *		Redes de Computadores - Prof. Dr. Ronaldo Alves Ferreira
 *		Alunos: Geraldo Landre, Marcel Tolentino, Vinícius Bueno
 *****************************************************************************/
/* tcbdealloc.c - tcbdealloc */

#include "tcpfms.h"
#include "tcb.h"
#include "tcptimer.h"

/*------------------------------------------------------------------------
 *  tcbdealloc - desaloca uma TCB e libera seus recursos
 *	ASSUME ptcb->tcb_mutex REALIZADA
 *------------------------------------------------------------------------
 */
int tcbdealloc(struct tcb *ptcb)
{
	if (ptcb->tcb_state == TCPS_FREE)
            return OK;
	switch (ptcb->tcb_type) {
	case TCPT_CONNECTION:
            tcpkilltimers(ptcb);
            sem_destroy(&(ptcb->tcb_ocsem));
            sem_destroy(&(ptcb->tcb_ssema));
            sem_destroy(&(ptcb->tcb_rsema));

            //freemem(ptcb->tcb_sndbuf, ptcb->tcb_sbsize);
            free(ptcb->tcb_sndbuf); // ou seria bzero..?
            //freemem(ptcb->tcb_rcvbuf, ptcb->tcb_rbsize);
            free(ptcb->tcb_rcvbuf); // ou seria bzero..?
            if (ptcb->tcb_rsegq >= 0)
                freequeue(ptcb->tcb_rsegq);
            break;
	case TCPT_SERVER:
            //pdelete(ptcb->tcb_listenq, 0);
            freeport(ptcb->tcb_listenq);
            break;
	default:
            sem_post(&(ptcb->tcb_mutex));
            return SYSERR;
	}
	ptcb->tcb_state = TCPS_FREE;
        sync_enqueue(tcbqueue, ptcb->tcb_dvnum);
	sem_destroy(&(ptcb->tcb_mutex));
	return OK;
}
